<?php

namespace fastphp;

/**
 * FastPHP框架入口类
 * 负责初始化框架环境并启动应用
 */
class FastPHP
{
    /**
     * 应用根路径
     * @var string
     */
    protected $appPath;
    
    /**
     * 框架根路径
     * @var string
     */
    protected $frameworkPath;
    
    /**
     * 构造函数
     * @param string $rootPath 项目根路径（可选）
     */
    public function __construct($rootPath = null)
    {
        $this->frameworkPath = __DIR__ . '/';
        
        if ($rootPath) {
            // 使用传入的根路径
            $this->appPath = rtrim($rootPath, '/') . '/';
        } else {
            // 自动计算应用路径
            $this->appPath = $this->calculateAppPath();
        }
        
        // 初始化常量
        $this->initConstants();
        
        // 确保必要的目录存在
        $this->ensureDirectories();
    }
    
    /**
     * 计算应用根路径
     * @return string
     */
    protected function calculateAppPath()
    {
        $repPath = str_replace("\\", "/", dirname($_SERVER['SCRIPT_FILENAME']) . '/');
        return str_replace("/public", "", $repPath);
    }
    
    /**
     * 初始化框架常量
     */
    // 修改后
    protected function initConstants()
    {
        // 初始化常量
        defined('ROOT') or define('ROOT', $this->frameworkPath);
        defined('APP_PATH') or define('APP_PATH', $this->appPath); // 应用目录
        defined('CONFIG_PATH') or define('CONFIG_PATH', $this->appPath . 'config/'); // 配置文件目录
        defined('RUNTIME_PATH') or define('RUNTIME_PATH', $this->appPath . 'runtime/'); // 确保指向项目根目录
        defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log/'); // 日志目录
        defined('VENDOR_PATH') or define('VENDOR_PATH', $this->appPath . 'vendor/'); // 第三方库目录
        defined('PUBLIC_PATH') or define('PUBLIC_PATH', $this->appPath . 'public/'); // 公共资源目录
    
        // 类文件扩展名
        defined('EXT') or define('EXT', '.class.php');
        defined('NORMAL_EXT') or define('NORMAL_EXT', '.php');
    }
    
    /**
     * 确保必要的目录存在
     */
    protected function ensureDirectories()
    {
        if (!is_dir(RUNTIME_PATH)) {
            mkdir(RUNTIME_PATH, 0755, true);
        }
        if (!is_dir(CONFIG_PATH)) {
            mkdir(CONFIG_PATH, 0755, true);
        }
        if (!is_dir(LOG_PATH)) {
            mkdir(LOG_PATH, 0755, true); // 创建日志目录
        }
        // 添加模板引擎所需的目录
        if (!is_dir(RUNTIME_PATH . 'templates/')) {
            mkdir(RUNTIME_PATH . 'templates/', 0755, true);
        }
        if (!is_dir(RUNTIME_PATH . 'cache/')) {
            mkdir(RUNTIME_PATH . 'cache/', 0755, true);
        }
    }
    
    /**
     * 加载必要的文件
     */
    protected function loadDependencies()
    {
        // 加载Composer自动加载器（如果存在）
        if (file_exists(VENDOR_PATH . 'autoload.php')) {
            require_once VENDOR_PATH . 'autoload.php';
        }
        
        // 移除直接加载config.php的代码
        // if (file_exists(CONFIG_PATH . 'config.php')) {
        //     require_once CONFIG_PATH . 'config.php';
        //     
        //     // 设置日志路径常量
        //     if (defined('LogDir')) {
        //         define('LOG_PATH', RUNTIME_PATH . LogDir);
        //         if (defined('DB_LOG')) {
        //             define('DB_LOG_PATH', RUNTIME_PATH . LogDir . '/' . DB_LOG);
        //         }
        //     }
        // }
        
        // 加载核心框架类
        require_once ROOT . 'Core.php';
    }
    
    /**
     * 启动应用
     */
    // 修改run方法，在启动应用时注册Core实例
    public function run()
    {
        // 加载必要的文件
        $this->loadDependencies();
        
        // 创建核心类实例
        $core = new Core();
        
        // 注册到全局变量，以便在路由分发时访问
        $GLOBALS['core'] = $core;
        
        // 运行应用
        $core->run();
    }
}
